package com.sxy.tools;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 字符串工具类
 * @author sxy
 */
public class DocumentStringUtils {

    /**
     * 最大小数位数
     */
    private static final Integer MAX_SCALE = 8;

    /**
     * 最小小数位数
     */
    private static final Integer MIN_SCALE = 0;

    /**
     * 负号
     */
    private static final String NEGATIVE_SIGN = "-";

    /**
     * 中文数字对应的大写
     */
    private static final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    /**
     * 对应单位的大写
     */
    private static final String[] CN_UPPER_UNIT = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万"};
    /**
     * 整数部分和小数部分分隔符
     */
    private static final String DECIMAL_POINT = "点";
    /**
     * 特殊字符：整数结束标识
     */
    private static final String INTEGER_END = "整";
    /**
     * 特殊字符：小数结束标识
     */
    private static final String DECIMAL_END = "角分";


    /**
     * 将字符串格式化为千分位格式。
     *
     * @param number 需要格式化的数字字符串。
     * @param scale  小数点后的位数。
     * @return 格式化后的千分位字符串。
     */
    public static String formatToThousandth(String number, int scale) {
        //1.移除字符串中的非数字字符
        String sanitizedNumber = number.replaceAll("[^\\d.]", "");
        //2.判断小数位数是否在允许范围内
        if (scale < MIN_SCALE || scale > MAX_SCALE) {
            throw new IllegalArgumentException("小数位数必须介于" + MIN_SCALE + "和" + MAX_SCALE + "之间");
        }
        //3.保留指定的小数位数
        DecimalFormat df = new DecimalFormat("#,##0." + new String(new char[scale]).replace("\0", "0"));
        //4.如果是负数，则保留负号
        if (sanitizedNumber.startsWith(NEGATIVE_SIGN)) {
            df.setNegativePrefix(NEGATIVE_SIGN);
            sanitizedNumber = sanitizedNumber.substring(1);
        }
        return df.format(new BigDecimal(sanitizedNumber));
    }

    /**
     * 格式化字符串日期格式
     *
     * @param dateStr yyyyMMdd
     * @param format  yyyy/MM/dd yyyy-MM-dd yyyy年MM月dd日
     * @return 格式化后的日期
     */
    public static String formatDate(String dateStr, String format) {
        dateStr = dateStr.trim();
        if (dateStr.length() != 8) {
            return dateStr;
        }
        //解析原始日期（从yyyyMMdd到Date）
        SimpleDateFormat parser = new SimpleDateFormat("yyyyMMdd");
        //格式化后的日期（从Date到format）
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        Date date = null;
        try {
            //解析原始日期
            date = parser.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //格式化后的日期
        return formatter.format(date);
    }

}
